| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211 | 1
1
16
116
1
3
3
3
3
9
3
1
1
3
3
3
1
43
23
20
20
1
23
15
15
3
15
8
23
1
1
1
1
1
1
58
58
58
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
32
32
32
32
1
1
119
1
12
1
1
29
29
1
1
1
1
3
3
3
3
3
1
1
19
19
1
5
5
5
1
1
3
3
3
3
8
8
3
1
1
1
1
9
9
9
9
9
1
1
43
43
43
1
23
23
23
1
1
9
9
29
9
1
1
1
1
1
1
1
1
1
1
3
3
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
7
1
1
1
1
1
1
1
9
9
9
1
1
29
1
1
9
1
1
1
1
1
1
1
1
1
5
5
15
5
1
1
1
1
1
3
3
3
3
1
1
1
1
1
1
2
2
2
2
1
1
4
4
8
4
1
1
2
2
2
4
4
4
2
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
| System.register(['./path-observer', './composite-observer', './access-keyed-observer'], function (_export) {
'use strict';
var PathObserver, CompositeObserver, AccessKeyedObserver, Expression, Chain, ValueConverter, Assign, Conditional, AccessScope, AccessMember, AccessKeyed, CallScope, CallMember, CallFunction, Binary, PrefixNot, LiteralPrimitive, LiteralString, LiteralArray, LiteralObject, Unparser, evalListCache;
function _inherits(subClass, superClass) { Iif (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
/// Evaluate the [list] in context of the [scope].
function evalList(scope, list, valueConverters) {
var length = list.length,
cacheLength,
i;
for (cacheLength = evalListCache.length; cacheLength <= length; ++cacheLength) {
evalListCache.push([]);
}
var result = evalListCache[length];
for (i = 0; i < length; ++i) {
result[i] = list[i].evaluate(scope, valueConverters);
}
return result;
}
/// Add the two arguments with automatic type conversion.
function autoConvertAdd(a, b) {
if (a != null && b != null) {
// TODO(deboer): Support others.
if (typeof a == 'string' && typeof b != 'string') {
return a + b.toString();
}
if (typeof a != 'string' && typeof b == 'string') {
return a.toString() + b;
}
return a + b;
}
if (a != null) {
return a;
}
if (b != null) {
return b;
}
return 0;
}
function ensureFunctionFromMap(obj, name) {
var func = obj[name];
Eif (typeof func === 'function') {
return func;
}
if (func === null) {
throw new Error('Undefined function ' + name);
} else {
throw new Error('' + name + ' is not a function');
}
}
function getKeyed(obj, key) {
if (Array.isArray(obj)) {
return obj[parseInt(key)];
} else Eif (obj) {
return obj[key];
} else if (obj === null) {
throw new Error('Accessing null object');
} else {
return obj[key];
}
}
function setKeyed(obj, key, value) {
if (Array.isArray(obj)) {
var index = parseInt(key);
if (obj.length <= index) {
obj.length = index + 1;
}
obj[index] = value;
} else {
obj[key] = value;
}
return value;
}
return {
setters: [function (_pathObserver) {
PathObserver = _pathObserver.PathObserver;
}, function (_compositeObserver) {
CompositeObserver = _compositeObserver.CompositeObserver;
}, function (_accessKeyedObserver) {
AccessKeyedObserver = _accessKeyedObserver.AccessKeyedObserver;
}],
execute: function () {
Expression = (function () {
function Expression() {
_classCallCheck(this, Expression);
this.isChain = false;
this.isAssignable = false;
}
Expression.prototype.evaluate = function evaluate() {
throw new Error('Cannot evaluate ' + this);
};
Expression.prototype.assign = function assign() {
throw new Error('Cannot assign to ' + this);
};
Expression.prototype.toString = function toString() {
return Unparser.unparse(this);
};
return Expression;
})();
_export('Expression', Expression);
Chain = (function (_Expression) {
function Chain(expressions) {
_classCallCheck(this, Chain);
_Expression.call(this);
this.expressions = expressions;
this.isChain = true;
}
_inherits(Chain, _Expression);
Chain.prototype.evaluate = function evaluate(scope, valueConverters) {
var result,
expressions = this.expressions,
length = expressions.length,
i,
last;
for (i = 0; i < length; ++i) {
last = expressions[i].evaluate(scope, valueConverters);
if (last !== null) {
result = last;
}
}
return result;
};
Chain.prototype.accept = function accept(visitor) {
visitor.visitChain(this);
};
return Chain;
})(Expression);
_export('Chain', Chain);
ValueConverter = (function (_Expression2) {
function ValueConverter(expression, name, args, allArgs) {
_classCallCheck(this, ValueConverter);
_Expression2.call(this);
this.expression = expression;
this.name = name;
this.args = args;
this.allArgs = allArgs;
}
_inherits(ValueConverter, _Expression2);
ValueConverter.prototype.evaluate = function evaluate(scope, valueConverters) {
var converter = valueConverters(this.name);
if (!converter) {
throw new Error('No ValueConverter named "' + this.name + '" was found!');
}
if ('toView' in converter) {
return converter.toView.apply(converter, evalList(scope, this.allArgs, valueConverters));
}
return this.allArgs[0].evaluate(scope, valueConverters);
};
ValueConverter.prototype.assign = function assign(scope, value, valueConverters) {
var converter = valueConverters(this.name);
if (!converter) {
throw new Error('No ValueConverter named "' + this.name + '" was found!');
}
if ('fromView' in converter) {
value = converter.fromView.apply(converter, [value].concat(evalList(scope, this.args, valueConverters)));
}
return this.allArgs[0].assign(scope, value, valueConverters);
};
ValueConverter.prototype.accept = function accept(visitor) {
visitor.visitValueConverter(this);
};
ValueConverter.prototype.connect = function connect(binding, scope) {
var _this = this;
var observer,
childObservers = [],
i,
ii,
exp,
expInfo;
for (i = 0, ii = this.allArgs.length; i < ii; ++i) {
exp = this.allArgs[i];
expInfo = exp.connect(binding, scope);
if (expInfo.observer) {
childObservers.push(expInfo.observer);
}
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return ValueConverter;
})(Expression);
_export('ValueConverter', ValueConverter);
Assign = (function (_Expression3) {
function Assign(target, value) {
_classCallCheck(this, Assign);
_Expression3.call(this);
this.target = target;
this.value = value;
}
_inherits(Assign, _Expression3);
Assign.prototype.evaluate = function evaluate(scope, valueConverters) {
return this.target.assign(scope, this.value.evaluate(scope, valueConverters));
};
Assign.prototype.accept = function accept(vistor) {
vistor.visitAssign(this);
};
Assign.prototype.connect = function connect(binding, scope) {
return { value: this.evaluate(scope, binding.valueConverterLookupFunction) };
};
return Assign;
})(Expression);
_export('Assign', Assign);
Conditional = (function (_Expression4) {
function Conditional(condition, yes, no) {
_classCallCheck(this, Conditional);
_Expression4.call(this);
this.condition = condition;
this.yes = yes;
this.no = no;
}
_inherits(Conditional, _Expression4);
Conditional.prototype.evaluate = function evaluate(scope, valueConverters) {
return !!this.condition.evaluate(scope) ? this.yes.evaluate(scope) : this.no.evaluate(scope);
};
Conditional.prototype.accept = function accept(visitor) {
visitor.visitConditional(this);
};
Conditional.prototype.connect = function connect(binding, scope) {
var _this2 = this;
var conditionInfo = this.condition.connect(binding, scope),
yesInfo = this.yes.connect(binding, scope),
noInfo = this.no.connect(binding, scope),
childObservers = [],
observer;
if (conditionInfo.observer) {
childObservers.push(conditionInfo.observer);
}
if (yesInfo.observer) {
childObservers.push(yesInfo.observer);
}
if (noInfo.observer) {
childObservers.push(noInfo.observer);
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this2.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: !!conditionInfo.value ? yesInfo.value : noInfo.value,
observer: observer
};
};
return Conditional;
})(Expression);
_export('Conditional', Conditional);
AccessScope = (function (_Expression5) {
function AccessScope(name) {
_classCallCheck(this, AccessScope);
_Expression5.call(this);
this.name = name;
this.isAssignable = true;
}
_inherits(AccessScope, _Expression5);
AccessScope.prototype.evaluate = function evaluate(scope, valueConverters) {
return scope[this.name];
};
AccessScope.prototype.assign = function assign(scope, value) {
return scope[this.name] = value;
};
AccessScope.prototype.accept = function accept(visitor) {
visitor.visitAccessScope(this);
};
AccessScope.prototype.connect = function connect(binding, scope) {
var observer = binding.getObserver(scope, this.name);
return {
value: observer.getValue(),
observer: observer
};
};
return AccessScope;
})(Expression);
_export('AccessScope', AccessScope);
AccessMember = (function (_Expression6) {
function AccessMember(object, name) {
_classCallCheck(this, AccessMember);
_Expression6.call(this);
this.object = object;
this.name = name;
this.isAssignable = true;
}
_inherits(AccessMember, _Expression6);
AccessMember.prototype.evaluate = function evaluate(scope, valueConverters) {
var instance = this.object.evaluate(scope, valueConverters);
return instance === null || instance === undefined ? instance : instance[this.name];
};
AccessMember.prototype.assign = function assign(scope, value) {
var instance = this.object.evaluate(scope);
Iif (instance === null || instance === undefined) {
instance = {};
this.object.assign(scope, instance);
}
return instance[this.name] = value;
};
AccessMember.prototype.accept = function accept(visitor) {
visitor.visitAccessMember(this);
};
AccessMember.prototype.connect = function connect(binding, scope) {
var _this3 = this;
var info = this.object.connect(binding, scope),
objectInstance = info.value,
objectObserver = info.observer,
observer;
Eif (objectObserver) {
observer = new PathObserver(objectObserver, function (value) {
Iif (value == null || value == undefined) {
return value;
}
return binding.getObserver(value, _this3.name);
}, objectInstance);
} else {
observer = binding.getObserver(objectInstance, this.name);
}
return {
value: objectInstance == null ? null : objectInstance[this.name], //TODO: use prop abstraction
observer: observer
};
};
return AccessMember;
})(Expression);
_export('AccessMember', AccessMember);
AccessKeyed = (function (_Expression7) {
function AccessKeyed(object, key) {
_classCallCheck(this, AccessKeyed);
_Expression7.call(this);
this.object = object;
this.key = key;
this.isAssignable = true;
}
_inherits(AccessKeyed, _Expression7);
AccessKeyed.prototype.evaluate = function evaluate(scope, valueConverters) {
var instance = this.object.evaluate(scope, valueConverters);
var lookup = this.key.evaluate(scope, valueConverters);
return getKeyed(instance, lookup);
};
AccessKeyed.prototype.assign = function assign(scope, value) {
var instance = this.object.evaluate(scope);
var lookup = this.key.evaluate(scope);
return setKeyed(instance, lookup, value);
};
AccessKeyed.prototype.accept = function accept(visitor) {
visitor.visitAccessKeyed(this);
};
AccessKeyed.prototype.connect = function connect(binding, scope) {
var _this4 = this;
var objectInfo = this.object.connect(binding, scope),
keyInfo = this.key.connect(binding, scope),
observer = new AccessKeyedObserver(objectInfo, keyInfo, binding.observerLocator, function () {
return _this4.evaluate(scope, binding.valueConverterLookupFunction);
});
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return AccessKeyed;
})(Expression);
_export('AccessKeyed', AccessKeyed);
CallScope = (function (_Expression8) {
function CallScope(name, args) {
_classCallCheck(this, CallScope);
_Expression8.call(this);
this.name = name;
this.args = args;
}
_inherits(CallScope, _Expression8);
CallScope.prototype.evaluate = function evaluate(scope, valueConverters, args) {
args = args || evalList(scope, this.args, valueConverters);
return ensureFunctionFromMap(scope, this.name).apply(scope, args);
};
CallScope.prototype.accept = function accept(visitor) {
visitor.visitCallScope(this);
};
CallScope.prototype.connect = function connect(binding, scope) {
var _this5 = this;
var observer,
childObservers = [],
i,
ii,
exp,
expInfo;
for (i = 0, ii = this.args.length; i < ii; ++i) {
exp = this.args[i];
expInfo = exp.connect(binding, scope);
if (expInfo.observer) {
childObservers.push(expInfo.observer);
}
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this5.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return CallScope;
})(Expression);
_export('CallScope', CallScope);
CallMember = (function (_Expression9) {
function CallMember(object, name, args) {
_classCallCheck(this, CallMember);
_Expression9.call(this);
this.object = object;
this.name = name;
this.args = args;
}
_inherits(CallMember, _Expression9);
CallMember.prototype.evaluate = function evaluate(scope, valueConverters, args) {
var instance = this.object.evaluate(scope, valueConverters);
args = args || evalList(scope, this.args, valueConverters);
return ensureFunctionFromMap(instance, this.name).apply(instance, args);
};
CallMember.prototype.accept = function accept(visitor) {
visitor.visitCallMember(this);
};
CallMember.prototype.connect = function connect(binding, scope) {
var _this6 = this;
var observer,
objectInfo = this.object.connect(binding, scope),
childObservers = [],
i,
ii,
exp,
expInfo;
if (objectInfo.observer) {
childObservers.push(objectInfo.observer);
}
for (i = 0, ii = this.args.length; i < ii; ++i) {
exp = this.args[i];
expInfo = exp.connect(binding, scope);
if (expInfo.observer) {
childObservers.push(expInfo.observer);
}
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this6.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return CallMember;
})(Expression);
_export('CallMember', CallMember);
CallFunction = (function (_Expression10) {
function CallFunction(func, args) {
_classCallCheck(this, CallFunction);
_Expression10.call(this);
this.func = func;
this.args = args;
}
_inherits(CallFunction, _Expression10);
CallFunction.prototype.evaluate = function evaluate(scope, valueConverters, args) {
var func = this.func.evaluate(scope, valueConverters);
if (typeof func !== 'function') {
throw new Error('' + this.func + ' is not a function');
} else {
return func.apply(null, args || evalList(scope, this.args, valueConverters));
}
};
CallFunction.prototype.accept = function accept(visitor) {
visitor.visitCallFunction(this);
};
CallFunction.prototype.connect = function connect(binding, scope) {
var _this7 = this;
var observer,
funcInfo = this.func.connect(binding, scope),
childObservers = [],
i,
ii,
exp,
expInfo;
if (funcInfo.observer) {
childObservers.push(funcInfo.observer);
}
for (i = 0, ii = this.args.length; i < ii; ++i) {
exp = this.args[i];
expInfo = exp.connect(binding, scope);
if (expInfo.observer) {
childObservers.push(expInfo.observer);
}
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this7.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return CallFunction;
})(Expression);
_export('CallFunction', CallFunction);
Binary = (function (_Expression11) {
function Binary(operation, left, right) {
_classCallCheck(this, Binary);
_Expression11.call(this);
this.operation = operation;
this.left = left;
this.right = right;
}
_inherits(Binary, _Expression11);
Binary.prototype.evaluate = function evaluate(scope, valueConverters) {
var left = this.left.evaluate(scope);
switch (this.operation) {
case '&&':
return left && this.right.evaluate(scope);
case '||':
return left || this.right.evaluate(scope);
}
var right = this.right.evaluate(scope);
switch (this.operation) {
case '==':
return left == right;
case '===':
return left === right;
case '!=':
return left != right;
case '!==':
return left !== right;
}
// Null check for the operations.
if (left === null || right === null) {
switch (this.operation) {
case '+':
if (left != null) return left;
if (right != null) return right;
return 0;
case '-':
if (left != null) return left;
if (right != null) return 0 - right;
return 0;
}
return null;
}
switch (this.operation) {
case '+':
return autoConvertAdd(left, right);
case '-':
return left - right;
case '*':
return left * right;
case '/':
return left / right;
case '%':
return left % right;
case '<':
return left < right;
case '>':
return left > right;
case '<=':
return left <= right;
case '>=':
return left >= right;
case '^':
return left ^ right;
case '&':
return left & right;
}
throw new Error('Internal error [' + this.operation + '] not handled');
};
Binary.prototype.accept = function accept(visitor) {
visitor.visitBinary(this);
};
Binary.prototype.connect = function connect(binding, scope) {
var _this8 = this;
var leftInfo = this.left.connect(binding, scope),
rightInfo = this.right.connect(binding, scope),
childObservers = [],
observer;
if (leftInfo.observer) {
childObservers.push(leftInfo.observer);
}
if (rightInfo.observer) {
childObservers.push(rightInfo.observer);
}
if (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this8.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: this.evaluate(scope, binding.valueConverterLookupFunction),
observer: observer
};
};
return Binary;
})(Expression);
_export('Binary', Binary);
PrefixNot = (function (_Expression12) {
function PrefixNot(operation, expression) {
_classCallCheck(this, PrefixNot);
_Expression12.call(this);
this.operation = operation;
this.expression = expression;
}
_inherits(PrefixNot, _Expression12);
PrefixNot.prototype.evaluate = function evaluate(scope, valueConverters) {
return !this.expression.evaluate(scope);
};
PrefixNot.prototype.accept = function accept(visitor) {
visitor.visitPrefix(this);
};
PrefixNot.prototype.connect = function connect(binding, scope) {
var _this9 = this;
var info = this.expression.connect(binding, scope),
observer;
if (info.observer) {
observer = new CompositeObserver([info.observer], function () {
return _this9.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: !info.value,
observer: observer
};
};
return PrefixNot;
})(Expression);
_export('PrefixNot', PrefixNot);
LiteralPrimitive = (function (_Expression13) {
function LiteralPrimitive(value) {
_classCallCheck(this, LiteralPrimitive);
_Expression13.call(this);
this.value = value;
}
_inherits(LiteralPrimitive, _Expression13);
LiteralPrimitive.prototype.evaluate = function evaluate(scope, valueConverters) {
return this.value;
};
LiteralPrimitive.prototype.accept = function accept(visitor) {
visitor.visitLiteralPrimitive(this);
};
LiteralPrimitive.prototype.connect = function connect(binding, scope) {
return { value: this.value };
};
return LiteralPrimitive;
})(Expression);
_export('LiteralPrimitive', LiteralPrimitive);
LiteralString = (function (_Expression14) {
function LiteralString(value) {
_classCallCheck(this, LiteralString);
_Expression14.call(this);
this.value = value;
}
_inherits(LiteralString, _Expression14);
LiteralString.prototype.evaluate = function evaluate(scope, valueConverters) {
return this.value;
};
LiteralString.prototype.accept = function accept(visitor) {
visitor.visitLiteralString(this);
};
LiteralString.prototype.connect = function connect(binding, scope) {
return { value: this.value };
};
return LiteralString;
})(Expression);
_export('LiteralString', LiteralString);
LiteralArray = (function (_Expression15) {
function LiteralArray(elements) {
_classCallCheck(this, LiteralArray);
_Expression15.call(this);
this.elements = elements;
}
_inherits(LiteralArray, _Expression15);
LiteralArray.prototype.evaluate = function evaluate(scope, valueConverters) {
var elements = this.elements,
length = elements.length,
result = [],
i;
for (i = 0; i < length; ++i) {
result[i] = elements[i].evaluate(scope, valueConverters);
}
return result;
};
LiteralArray.prototype.accept = function accept(visitor) {
visitor.visitLiteralArray(this);
};
LiteralArray.prototype.connect = function connect(binding, scope) {
var _this10 = this;
var observer,
childObservers = [],
results = [],
i,
ii,
exp,
expInfo;
for (i = 0, ii = this.elements.length; i < ii; ++i) {
exp = this.elements[i];
expInfo = exp.connect(binding, scope);
Iif (expInfo.observer) {
childObservers.push(expInfo.observer);
}
results[i] = expInfo.value;
}
Iif (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this10.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: results,
observer: observer
};
};
return LiteralArray;
})(Expression);
_export('LiteralArray', LiteralArray);
LiteralObject = (function (_Expression16) {
function LiteralObject(keys, values) {
_classCallCheck(this, LiteralObject);
_Expression16.call(this);
this.keys = keys;
this.values = values;
}
_inherits(LiteralObject, _Expression16);
LiteralObject.prototype.evaluate = function evaluate(scope, valueConverters) {
var instance = {},
keys = this.keys,
values = this.values,
length = keys.length,
i;
for (i = 0; i < length; ++i) {
instance[keys[i]] = values[i].evaluate(scope, valueConverters);
}
return instance;
};
LiteralObject.prototype.accept = function accept(visitor) {
visitor.visitLiteralObject(this);
};
LiteralObject.prototype.connect = function connect(binding, scope) {
var _this11 = this;
var observer,
childObservers = [],
instance = {},
keys = this.keys,
values = this.values,
length = keys.length,
i,
valueInfo;
for (i = 0; i < length; ++i) {
valueInfo = values[i].connect(binding, scope);
Iif (valueInfo.observer) {
childObservers.push(valueInfo.observer);
}
instance[keys[i]] = valueInfo.value;
}
Iif (childObservers.length) {
observer = new CompositeObserver(childObservers, function () {
return _this11.evaluate(scope, binding.valueConverterLookupFunction);
});
}
return {
value: instance,
observer: observer
};
};
return LiteralObject;
})(Expression);
_export('LiteralObject', LiteralObject);
Unparser = (function () {
function Unparser(buffer) {
_classCallCheck(this, Unparser);
this.buffer = buffer;
}
Unparser.unparse = function unparse(expression) {
var buffer = [],
visitor = new Unparser(buffer);
expression.accept(visitor);
return buffer.join('');
};
Unparser.prototype.write = function write(text) {
this.buffer.push(text);
};
Unparser.prototype.writeArgs = function writeArgs(args) {
var i, length;
this.write('(');
for (i = 0, length = args.length; i < length; ++i) {
if (i !== 0) {
this.write(',');
}
args[i].accept(this);
}
this.write(')');
};
Unparser.prototype.visitChain = function visitChain(chain) {
var expressions = chain.expressions,
length = expressions.length,
i;
for (i = 0; i < length; ++i) {
if (i !== 0) {
this.write(';');
}
expressions[i].accept(this);
}
};
Unparser.prototype.visitValueConverter = function visitValueConverter(converter) {
var args = converter.args,
length = args.length,
i;
this.write('(');
converter.expression.accept(this);
this.write('|' + converter.name);
for (i = 0; i < length; ++i) {
this.write(' :');
args[i].accept(this);
}
this.write(')');
};
Unparser.prototype.visitAssign = function visitAssign(assign) {
assign.target.accept(this);
this.write('=');
assign.value.accept(this);
};
Unparser.prototype.visitConditional = function visitConditional(conditional) {
conditional.condition.accept(this);
this.write('?');
conditional.yes.accept(this);
this.write(':');
conditional.no.accept(this);
};
Unparser.prototype.visitAccessScope = function visitAccessScope(access) {
this.write(access.name);
};
Unparser.prototype.visitAccessMember = function visitAccessMember(access) {
access.object.accept(this);
this.write('.' + access.name);
};
Unparser.prototype.visitAccessKeyed = function visitAccessKeyed(access) {
access.object.accept(this);
this.write('[');
access.key.accept(this);
this.write(']');
};
Unparser.prototype.visitCallScope = function visitCallScope(call) {
this.write(call.name);
this.writeArgs(call.args);
};
Unparser.prototype.visitCallFunction = function visitCallFunction(call) {
call.func.accept(this);
this.writeArgs(call.args);
};
Unparser.prototype.visitCallMember = function visitCallMember(call) {
call.object.accept(this);
this.write('.' + call.name);
this.writeArgs(call.args);
};
Unparser.prototype.visitPrefix = function visitPrefix(prefix) {
this.write('(' + prefix.operation);
prefix.expression.accept(this);
this.write(')');
};
Unparser.prototype.visitBinary = function visitBinary(binary) {
this.write('(');
binary.left.accept(this);
this.write(binary.operation);
binary.right.accept(this);
this.write(')');
};
Unparser.prototype.visitLiteralPrimitive = function visitLiteralPrimitive(literal) {
this.write('' + literal.value);
};
Unparser.prototype.visitLiteralArray = function visitLiteralArray(literal) {
var elements = literal.elements,
length = elements.length,
i;
this.write('[');
for (i = 0; i < length; ++i) {
if (i !== 0) {
this.write(',');
}
elements[i].accept(this);
}
this.write(']');
};
Unparser.prototype.visitLiteralObject = function visitLiteralObject(literal) {
var keys = literal.keys,
values = literal.values,
length = keys.length,
i;
this.write('{');
for (i = 0; i < length; ++i) {
if (i !== 0) {
this.write(',');
}
this.write('\'' + keys[i] + '\':');
values[i].accept(this);
}
this.write('}');
};
Unparser.prototype.visitLiteralString = function visitLiteralString(literal) {
var escaped = literal.value.replace(/'/g, '\'');
this.write('\'' + escaped + '\'');
};
return Unparser;
})();
_export('Unparser', Unparser);
evalListCache = [[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0]];
}
};
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2FzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7NERBSWEsVUFBVSxFQW1CVixLQUFLLEVBOEJMLGNBQWMsRUFtRWQsTUFBTSxFQXFCTixXQUFXLEVBaURYLFdBQVcsRUE4QlgsWUFBWSxFQTREWixXQUFXLEVBc0NYLFNBQVMsRUE0Q1QsVUFBVSxFQW1EVixZQUFZLEVBc0RaLE1BQU0sRUEwRk4sU0FBUyxFQWlDVCxnQkFBZ0IsRUFvQmhCLGFBQWEsRUFvQmIsWUFBWSxFQXNEWixhQUFhLEVBMERiLFFBQVEsRUE2S2pCLGFBQWE7Ozs7Ozs7QUFHakIsV0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7QUFDOUMsUUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDcEIsV0FBVztRQUFFLENBQUMsQ0FBQzs7QUFFbkIsU0FBSyxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFO0FBQzdFLG1CQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3hCOztBQUVELFFBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFbkMsU0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDM0IsWUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0tBQ3REOztBQUVELFdBQU8sTUFBTSxDQUFDO0dBQ2Y7OztBQUdELFdBQVMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUIsUUFBSSxDQUFDLElBQUksSUFB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QyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL2JpbmRpbmcvc3JjL2FzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UGF0aE9ic2VydmVyfSBmcm9tICcuL3BhdGgtb2JzZXJ2ZXInO1xuaW1wb3J0IHtDb21wb3NpdGVPYnNlcnZlcn0gZnJvbSAnLi9jb21wb3NpdGUtb2JzZXJ2ZXInO1xuaW1wb3J0IHtBY2Nlc3NLZXllZE9ic2VydmVyfSBmcm9tICcuL2FjY2Vzcy1rZXllZC1vYnNlcnZlcic7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLmlzQ2hhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmlzQXNzaWduYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgZXZhbHVhdGUoKXtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBldmFsdWF0ZSAke3RoaXN9YCk7XG4gIH1cblxuICBhc3NpZ24oKXtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhc3NpZ24gdG8gJHt0aGlzfWApO1xuICB9XG5cbiAgdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gVW5wYXJzZXIudW5wYXJzZSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2hhaW4gZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbnMpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG4gICAgdGhpcy5pc0NoYWluID0gdHJ1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMsXG4gICAgICAgIGxlbmd0aCA9IGV4cHJlc3Npb25zLmxlbmd0aCxcbiAgICAgICAgaSwgbGFzdDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgbGFzdCA9IGV4cHJlc3Npb25zW2ldLmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuXG4gICAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQgPSBsYXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENoYWluKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYWx1ZUNvbnZlcnRlciBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uLCBuYW1lLCBhcmdzLCBhbGxBcmdzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hbGxBcmdzID0gYWxsQXJncztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBjb252ZXJ0ZXIgPSB2YWx1ZUNvbnZlcnRlcnModGhpcy5uYW1lKTtcbiAgICBpZighY29udmVydGVyKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gVmFsdWVDb252ZXJ0ZXIgbmFtZWQgXCIke3RoaXMubmFtZX1cIiB3YXMgZm91bmQhYCk7XG4gICAgfVxuXG4gICAgaWYoJ3RvVmlldycgaW4gY29udmVydGVyKXtcbiAgICAgIHJldHVybiBjb252ZXJ0ZXIudG9WaWV3LmFwcGx5KGNvbnZlcnRlciwgZXZhbExpc3Qoc2NvcGUsIHRoaXMuYWxsQXJncywgdmFsdWVDb252ZXJ0ZXJzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWxsQXJnc1swXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGNvbnZlcnRlciA9IHZhbHVlQ29udmVydGVycyh0aGlzLm5hbWUpO1xuICAgIGlmKCFjb252ZXJ0ZXIpe1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBWYWx1ZUNvbnZlcnRlciBuYW1lZCBcIiR7dGhpcy5uYW1lfVwiIHdhcyBmb3VuZCFgKTtcbiAgICB9XG5cbiAgICBpZignZnJvbVZpZXcnIGluIGNvbnZlcnRlcil7XG4gICAgICB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tVmlldy5hcHBseShjb252ZXJ0ZXIsIFt2YWx1ZV0uY29uY2F0KGV2YWxMaXN0KHNjb3BlLCB0aGlzLmFyZ3MsIHZhbHVlQ29udmVydGVycykpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hbGxBcmdzWzBdLmFzc2lnbihzY29wZSwgdmFsdWUsIHZhbHVlQ29udmVydGVycyk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdFZhbHVlQ29udmVydGVyKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgdmFyIG9ic2VydmVyLFxuICAgICAgICBjaGlsZE9ic2VydmVycyA9IFtdLFxuICAgICAgICBpLCBpaSwgZXhwLCBleHBJbmZvO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHRoaXMuYWxsQXJncy5sZW5ndGg7IGk8aWk7ICsraSl7XG4gICAgICBleHAgPSB0aGlzLmFsbEFyZ3NbaV1cbiAgICAgIGV4cEluZm8gPSBleHAuY29ubmVjdChiaW5kaW5nLCBzY29wZSk7XG5cbiAgICAgIGlmKGV4cEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGV4cEluZm8ub2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NpZ24gZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0LCB2YWx1ZSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHJldHVybiB0aGlzLnRhcmdldC5hc3NpZ24oc2NvcGUsIHRoaXMudmFsdWUuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycykpO1xuICB9XG5cbiAgYWNjZXB0KHZpc3Rvcil7XG4gICAgdmlzdG9yLnZpc2l0QXNzaWduKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbikgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uLCB5ZXMsIG5vKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgdGhpcy55ZXMgPSB5ZXM7XG4gICAgdGhpcy5ubyA9IG5vO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgcmV0dXJuICghIXRoaXMuY29uZGl0aW9uLmV2YWx1YXRlKHNjb3BlKSkgPyB0aGlzLnllcy5ldmFsdWF0ZShzY29wZSkgOiB0aGlzLm5vLmV2YWx1YXRlKHNjb3BlKTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0Q29uZGl0aW9uYWwodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgY29uZGl0aW9uSW5mbyA9IHRoaXMuY29uZGl0aW9uLmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICB5ZXNJbmZvID0gdGhpcy55ZXMuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIG5vSW5mbyA9IHRoaXMubm8uY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIG9ic2VydmVyO1xuXG4gICAgaWYoY29uZGl0aW9uSW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGNvbmRpdGlvbkluZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmKHllc0luZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaCh5ZXNJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBpZihub0luZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChub0luZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTooISFjb25kaXRpb25JbmZvLnZhbHVlKSA/IHllc0luZm8udmFsdWUgOiBub0luZm8udmFsdWUsXG4gICAgICBvYnNlcnZlcjogb2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NTY29wZSBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmlzQXNzaWduYWJsZSA9IHRydWU7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gc2NvcGVbdGhpcy5uYW1lXTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUpe1xuICAgIHJldHVybiBzY29wZVt0aGlzLm5hbWVdID0gdmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdEFjY2Vzc1Njb3BlKHRoaXMpO1xuICB9XG5cbiAgY29ubmVjdChiaW5kaW5nLCBzY29wZSl7XG4gICAgdmFyIG9ic2VydmVyID0gYmluZGluZy5nZXRPYnNlcnZlcihzY29wZSwgdGhpcy5uYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogb2JzZXJ2ZXIuZ2V0VmFsdWUoKSxcbiAgICAgIG9ic2VydmVyOiBvYnNlcnZlclxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWNjZXNzTWVtYmVyIGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKG9iamVjdCwgbmFtZSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pc0Fzc2lnbmFibGUgPSB0cnVlO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5vYmplY3QuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyk7XG4gICAgcmV0dXJuIGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWRcbiAgICAgID8gaW5zdGFuY2VcbiAgICAgIDogaW5zdGFuY2VbdGhpcy5uYW1lXTtcbiAgfVxuXG4gIGFzc2lnbihzY29wZSwgdmFsdWUpe1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMub2JqZWN0LmV2YWx1YXRlKHNjb3BlKTtcblxuICAgIGlmKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpe1xuICAgICAgaW5zdGFuY2UgPSB7fTtcbiAgICAgIHRoaXMub2JqZWN0LmFzc2lnbihzY29wZSwgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZVt0aGlzLm5hbWVdID0gdmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdEFjY2Vzc01lbWJlcih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBpbmZvID0gdGhpcy5vYmplY3QuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIG9iamVjdEluc3RhbmNlID0gaW5mby52YWx1ZSxcbiAgICAgICAgb2JqZWN0T2JzZXJ2ZXIgPSBpbmZvLm9ic2VydmVyLFxuICAgICAgICBvYnNlcnZlcjtcblxuICAgIGlmKG9iamVjdE9ic2VydmVyKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IFBhdGhPYnNlcnZlcihcbiAgICAgICAgb2JqZWN0T2JzZXJ2ZXIsXG4gICAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgICBpZih2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0T2JzZXJ2ZXIodmFsdWUsIHRoaXMubmFtZSlcbiAgICAgICAgfSxcbiAgICAgICAgb2JqZWN0SW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICB9ZWxzZXtcbiAgICAgIG9ic2VydmVyID0gYmluZGluZy5nZXRPYnNlcnZlcihvYmplY3RJbnN0YW5jZSwgdGhpcy5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IG9iamVjdEluc3RhbmNlID09IG51bGwgPyBudWxsIDogb2JqZWN0SW5zdGFuY2VbdGhpcy5uYW1lXSwgLy9UT0RPOiB1c2UgcHJvcCBhYnN0cmFjdGlvblxuICAgICAgb2JzZXJ2ZXI6IG9ic2VydmVyXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NLZXllZCBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihvYmplY3QsIGtleSl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuaXNBc3NpZ25hYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMub2JqZWN0LmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuICAgIHZhciBsb29rdXAgPSB0aGlzLmtleS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICByZXR1cm4gZ2V0S2V5ZWQoaW5zdGFuY2UsIGxvb2t1cCk7XG4gIH1cblxuICBhc3NpZ24oc2NvcGUsIHZhbHVlKXtcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLm9iamVjdC5ldmFsdWF0ZShzY29wZSk7XG4gICAgdmFyIGxvb2t1cCA9IHRoaXMua2V5LmV2YWx1YXRlKHNjb3BlKTtcbiAgICByZXR1cm4gc2V0S2V5ZWQoaW5zdGFuY2UsIGxvb2t1cCwgdmFsdWUpO1xuICB9XG5cbiAgYWNjZXB0KHZpc2l0b3Ipe1xuICAgIHZpc2l0b3IudmlzaXRBY2Nlc3NLZXllZCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYmplY3RJbmZvID0gdGhpcy5vYmplY3QuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGtleUluZm8gPSB0aGlzLmtleS5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKSxcbiAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgQWNjZXNzS2V5ZWRPYnNlcnZlcihvYmplY3RJbmZvLCBrZXlJbmZvLCBiaW5kaW5nLm9ic2VydmVyTG9jYXRvcixcbiAgICAgICAgICAoKSA9PiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYWxsU2NvcGUgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IobmFtZSwgYXJncyl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5hcmdzID0gYXJncztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMsIGFyZ3Mpe1xuICAgIGFyZ3MgPSBhcmdzIHx8IGV2YWxMaXN0KHNjb3BlLCB0aGlzLmFyZ3MsIHZhbHVlQ29udmVydGVycyk7XG4gICAgcmV0dXJuIGVuc3VyZUZ1bmN0aW9uRnJvbU1hcChzY29wZSwgdGhpcy5uYW1lKS5hcHBseShzY29wZSwgYXJncyk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENhbGxTY29wZSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgY2hpbGRPYnNlcnZlcnMgPSBbXSxcbiAgICAgICAgaSwgaWksIGV4cCwgZXhwSW5mbztcblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmFyZ3MubGVuZ3RoOyBpPGlpOyArK2kpe1xuICAgICAgZXhwID0gdGhpcy5hcmdzW2ldO1xuICAgICAgZXhwSW5mbyA9IGV4cC5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKTtcblxuICAgICAgaWYoZXhwSW5mby5vYnNlcnZlcil7XG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2goZXhwSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiksXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbGxNZW1iZXIgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBuYW1lLCBhcmdzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycywgYXJncyl7XG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5vYmplY3QuZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyk7XG4gICAgYXJncyA9IGFyZ3MgfHwgZXZhbExpc3Qoc2NvcGUsIHRoaXMuYXJncywgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICByZXR1cm4gZW5zdXJlRnVuY3Rpb25Gcm9tTWFwKGluc3RhbmNlLCB0aGlzLm5hbWUpLmFwcGx5KGluc3RhbmNlLCBhcmdzKTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0Q2FsbE1lbWJlcih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgb2JqZWN0SW5mbyA9IHRoaXMub2JqZWN0LmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICBjaGlsZE9ic2VydmVycyA9IFtdLFxuICAgICAgICBpLCBpaSwgZXhwLCBleHBJbmZvO1xuXG4gICAgaWYob2JqZWN0SW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKG9iamVjdEluZm8ub2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmFyZ3MubGVuZ3RoOyBpPGlpOyArK2kpe1xuICAgICAgZXhwID0gdGhpcy5hcmdzW2ldO1xuICAgICAgZXhwSW5mbyA9IGV4cC5jb25uZWN0KGJpbmRpbmcsIHNjb3BlKTtcblxuICAgICAgaWYoZXhwSW5mby5vYnNlcnZlcil7XG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2goZXhwSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbiksXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbGxGdW5jdGlvbiBleHRlbmRzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihmdW5jLGFyZ3Mpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzLCBhcmdzKXtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuYy5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcblxuICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuZnVuY30gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkobnVsbCwgYXJncyB8fCBldmFsTGlzdChzY29wZSwgdGhpcy5hcmdzLCB2YWx1ZUNvbnZlcnRlcnMpKTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdENhbGxGdW5jdGlvbih0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBvYnNlcnZlcixcbiAgICAgICAgZnVuY0luZm8gPSB0aGlzLmZ1bmMuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIGksIGlpLCBleHAsIGV4cEluZm87XG5cbiAgICBpZihmdW5jSW5mby5vYnNlcnZlcil7XG4gICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGZ1bmNJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBmb3IoaSA9IDAsIGlpID0gdGhpcy5hcmdzLmxlbmd0aDsgaTxpaTsgKytpKXtcbiAgICAgIGV4cCA9IHRoaXMuYXJnc1tpXTtcbiAgICAgIGV4cEluZm8gPSBleHAuY29ubmVjdChiaW5kaW5nLCBzY29wZSk7XG5cbiAgICAgIGlmKGV4cEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKGV4cEluZm8ub2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTp0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pLFxuICAgICAgb2JzZXJ2ZXI6b2JzZXJ2ZXJcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Iob3BlcmF0aW9uLCBsZWZ0LCByaWdodCl7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGxlZnQgPSB0aGlzLmxlZnQuZXZhbHVhdGUoc2NvcGUpO1xuXG4gICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbikge1xuICAgICAgY2FzZSAnJiYnOiByZXR1cm4gbGVmdCAmJiB0aGlzLnJpZ2h0LmV2YWx1YXRlKHNjb3BlKTtcbiAgICAgIGNhc2UgJ3x8JzogcmV0dXJuIGxlZnQgfHwgdGhpcy5yaWdodC5ldmFsdWF0ZShzY29wZSk7XG4gICAgfVxuXG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5yaWdodC5ldmFsdWF0ZShzY29wZSk7XG5cbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICc9PScgOiByZXR1cm4gbGVmdCA9PSByaWdodDtcbiAgICAgIGNhc2UgJz09PSc6IHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgIGNhc2UgJyE9JyA6IHJldHVybiBsZWZ0ICE9IHJpZ2h0O1xuICAgICAgY2FzZSAnIT09JzogcmV0dXJuIGxlZnQgIT09IHJpZ2h0O1xuICAgIH1cblxuICAgIC8vIE51bGwgY2hlY2sgZm9yIHRoZSBvcGVyYXRpb25zLlxuICAgIGlmIChsZWZ0ID09PSBudWxsIHx8IHJpZ2h0ID09PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpIHJldHVybiBsZWZ0O1xuICAgICAgICAgIGlmIChyaWdodCAhPSBudWxsKSByZXR1cm4gcmlnaHQ7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgIGlmIChsZWZ0ICE9IG51bGwpIHJldHVybiBsZWZ0O1xuICAgICAgICAgIGlmIChyaWdodCAhPSBudWxsKSByZXR1cm4gMCAtIHJpZ2h0O1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcrJyAgOiByZXR1cm4gYXV0b0NvbnZlcnRBZGQobGVmdCwgcmlnaHQpO1xuICAgICAgY2FzZSAnLScgIDogcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgIGNhc2UgJyonICA6IHJldHVybiBsZWZ0ICogcmlnaHQ7XG4gICAgICBjYXNlICcvJyAgOiByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgY2FzZSAnJScgIDogcmV0dXJuIGxlZnQgJSByaWdodDtcbiAgICAgIGNhc2UgJzwnICA6IHJldHVybiBsZWZ0IDwgcmlnaHQ7XG4gICAgICBjYXNlICc+JyAgOiByZXR1cm4gbGVmdCA+IHJpZ2h0O1xuICAgICAgY2FzZSAnPD0nIDogcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICBjYXNlICc+PScgOiByZXR1cm4gbGVmdCA+PSByaWdodDtcbiAgICAgIGNhc2UgJ14nICA6IHJldHVybiBsZWZ0IF4gcmlnaHQ7XG4gICAgICBjYXNlICcmJyAgOiByZXR1cm4gbGVmdCAmIHJpZ2h0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IgWyR7dGhpcy5vcGVyYXRpb259XSBub3QgaGFuZGxlZGApO1xuICB9XG5cbiAgYWNjZXB0KHZpc2l0b3Ipe1xuICAgIHZpc2l0b3IudmlzaXRCaW5hcnkodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgbGVmdEluZm8gPSB0aGlzLmxlZnQuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIHJpZ2h0SW5mbyA9IHRoaXMucmlnaHQuY29ubmVjdChiaW5kaW5nLCBzY29wZSksXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIG9ic2VydmVyO1xuXG4gICAgaWYobGVmdEluZm8ub2JzZXJ2ZXIpe1xuICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChsZWZ0SW5mby5vYnNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYocmlnaHRJbmZvLm9ic2VydmVyKXtcbiAgICAgIGNoaWxkT2JzZXJ2ZXJzLnB1c2gocmlnaHRJbmZvLm9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBpZihjaGlsZE9ic2VydmVycy5sZW5ndGgpe1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgQ29tcG9zaXRlT2JzZXJ2ZXIoY2hpbGRPYnNlcnZlcnMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGUoc2NvcGUsIGJpbmRpbmcudmFsdWVDb252ZXJ0ZXJMb29rdXBGdW5jdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6dGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKSxcbiAgICAgIG9ic2VydmVyOm9ic2VydmVyXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJlZml4Tm90IGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbiwgZXhwcmVzc2lvbil7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gIXRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShzY29wZSk7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdFByZWZpeCh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHZhciBpbmZvID0gdGhpcy5leHByZXNzaW9uLmNvbm5lY3QoYmluZGluZywgc2NvcGUpLFxuICAgICAgICBvYnNlcnZlcjtcblxuICAgIGlmKGluZm8ub2JzZXJ2ZXIpe1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgQ29tcG9zaXRlT2JzZXJ2ZXIoW2luZm8ub2JzZXJ2ZXJdLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiAhaW5mby52YWx1ZSxcbiAgICAgIG9ic2VydmVyOiBvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxQcmltaXRpdmUgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3IodmFsdWUpe1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKXtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIGFjY2VwdCh2aXNpdG9yKXtcbiAgICB2aXNpdG9yLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpe1xuICAgIHJldHVybiB7IHZhbHVlOnRoaXMudmFsdWUgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsU3RyaW5nIGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxTdHJpbmcodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICByZXR1cm4geyB2YWx1ZTp0aGlzLnZhbHVlIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGl0ZXJhbEFycmF5IGV4dGVuZHMgRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICB9XG5cbiAgZXZhbHVhdGUoc2NvcGUsIHZhbHVlQ29udmVydGVycyl7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cyxcbiAgICAgICAgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgaTtcblxuICAgIGZvcihpID0gMDsgaSA8IGxlbmd0aDsgKytpKXtcbiAgICAgIHJlc3VsdFtpXSA9IGVsZW1lbnRzW2ldLmV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxBcnJheSh0aGlzKTtcbiAgfVxuXG4gIGNvbm5lY3QoYmluZGluZywgc2NvcGUpIHtcbiAgICB2YXIgb2JzZXJ2ZXIsXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgaSwgaWksIGV4cCwgZXhwSW5mbztcblxuICAgIGZvcihpID0gMCwgaWkgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaTxpaTsgKytpKXtcbiAgICAgIGV4cCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBleHBJbmZvID0gZXhwLmNvbm5lY3QoYmluZGluZywgc2NvcGUpO1xuXG4gICAgICBpZihleHBJbmZvLm9ic2VydmVyKXtcbiAgICAgICAgY2hpbGRPYnNlcnZlcnMucHVzaChleHBJbmZvLm9ic2VydmVyKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0c1tpXSA9IGV4cEluZm8udmFsdWU7XG4gICAgfVxuXG4gICAgaWYoY2hpbGRPYnNlcnZlcnMubGVuZ3RoKXtcbiAgICAgIG9ic2VydmVyID0gbmV3IENvbXBvc2l0ZU9ic2VydmVyKGNoaWxkT2JzZXJ2ZXJzLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlKHNjb3BlLCBiaW5kaW5nLnZhbHVlQ29udmVydGVyTG9va3VwRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOnJlc3VsdHMsXG4gICAgICBvYnNlcnZlcjpvYnNlcnZlclxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxPYmplY3QgZXh0ZW5kcyBFeHByZXNzaW9uIHtcbiAgY29uc3RydWN0b3Ioa2V5cywgdmFsdWVzKXtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGV2YWx1YXRlKHNjb3BlLCB2YWx1ZUNvbnZlcnRlcnMpe1xuICAgIHZhciBpbnN0YW5jZSA9IHt9LFxuICAgICAgICBrZXlzID0gdGhpcy5rZXlzLFxuICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcbiAgICAgICAgbGVuZ3RoID0ga2V5cy5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBmb3IoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSl7XG4gICAgICBpbnN0YW5jZVtrZXlzW2ldXSA9IHZhbHVlc1tpXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICBhY2NlcHQodmlzaXRvcil7XG4gICAgdmlzaXRvci52aXNpdExpdGVyYWxPYmplY3QodGhpcyk7XG4gIH1cblxuICBjb25uZWN0KGJpbmRpbmcsIHNjb3BlKXtcbiAgICB2YXIgb2JzZXJ2ZXIsXG4gICAgICAgIGNoaWxkT2JzZXJ2ZXJzID0gW10sXG4gICAgICAgIGluc3RhbmNlID0ge30sXG4gICAgICAgIGtleXMgPSB0aGlzLmtleXMsXG4gICAgICAgIHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuICAgICAgICBsZW5ndGggPSBrZXlzLmxlbmd0aCxcbiAgICAgICAgaSwgdmFsdWVJbmZvO1xuXG4gICAgZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpe1xuICAgICAgdmFsdWVJbmZvID0gdmFsdWVzW2ldLmNvbm5lY3QoYmluZGluZywgc2NvcGUpO1xuXG4gICAgICBpZih2YWx1ZUluZm8ub2JzZXJ2ZXIpe1xuICAgICAgICBjaGlsZE9ic2VydmVycy5wdXNoKHZhbHVlSW5mby5vYnNlcnZlcik7XG4gICAgICB9XG5cbiAgICAgIGluc3RhbmNlW2tleXNbaV1dID0gdmFsdWVJbmZvLnZhbHVlO1xuICAgIH1cblxuICAgIGlmKGNoaWxkT2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICBvYnNlcnZlciA9IG5ldyBDb21wb3NpdGVPYnNlcnZlcihjaGlsZE9ic2VydmVycywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZShzY29wZSwgYmluZGluZy52YWx1ZUNvbnZlcnRlckxvb2t1cEZ1bmN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTppbnN0YW5jZSxcbiAgICAgIG9ic2VydmVyOm9ic2VydmVyXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5wYXJzZXIge1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgfVxuXG4gIHN0YXRpYyB1bnBhcnNlKGV4cHJlc3Npb24pIHtcbiAgICB2YXIgYnVmZmVyID0gW10sXG4gICAgICAgIHZpc2l0b3IgPSBuZXcgVW5wYXJzZXIoYnVmZmVyKTtcblxuICAgIGV4cHJlc3Npb24uYWNjZXB0KHZpc2l0b3IpO1xuXG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKCcnKTtcbiAgfVxuXG4gIHdyaXRlKHRleHQpe1xuICAgIHRoaXMuYnVmZmVyLnB1c2godGV4dCk7XG4gIH1cblxuICB3cml0ZUFyZ3MoYXJncykge1xuICAgIHZhciBpLCBsZW5ndGg7XG5cbiAgICB0aGlzLndyaXRlKCcoJyk7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICB0aGlzLndyaXRlKCcsJyk7XG4gICAgICB9XG5cbiAgICAgIGFyZ3NbaV0uYWNjZXB0KHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0Q2hhaW4oY2hhaW4pIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBjaGFpbi5leHByZXNzaW9ucyxcbiAgICAgICAgbGVuZ3RoID0gZXhwcmVzc2lvbnMubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICB0aGlzLndyaXRlKCc7Jyk7XG4gICAgICB9XG5cbiAgICAgIGV4cHJlc3Npb25zW2ldLmFjY2VwdCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICB2aXNpdFZhbHVlQ29udmVydGVyKGNvbnZlcnRlcikge1xuICAgIHZhciBhcmdzID0gY29udmVydGVyLmFyZ3MsXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgdGhpcy53cml0ZSgnKCcpO1xuICAgIGNvbnZlcnRlci5leHByZXNzaW9uLmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGB8JHtjb252ZXJ0ZXIubmFtZX1gKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgdGhpcy53cml0ZSgnIDonKTtcbiAgICAgIGFyZ3NbaV0uYWNjZXB0KHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0QXNzaWduKGFzc2lnbikge1xuICAgIGFzc2lnbi50YXJnZXQuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJz0nKTtcbiAgICBhc3NpZ24udmFsdWUuYWNjZXB0KHRoaXMpO1xuICB9XG5cbiAgdmlzaXRDb25kaXRpb25hbChjb25kaXRpb25hbCkge1xuICAgIGNvbmRpdGlvbmFsLmNvbmRpdGlvbi5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnPycpO1xuICAgIGNvbmRpdGlvbmFsLnllcy5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnOicpO1xuICAgIGNvbmRpdGlvbmFsLm5vLmFjY2VwdCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0QWNjZXNzU2NvcGUoYWNjZXNzKSB7XG4gICAgdGhpcy53cml0ZShhY2Nlc3MubmFtZSk7XG4gIH1cblxuICB2aXNpdEFjY2Vzc01lbWJlcihhY2Nlc3MpIHtcbiAgICBhY2Nlc3Mub2JqZWN0LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGAuJHthY2Nlc3MubmFtZX1gKTtcbiAgfVxuXG4gIHZpc2l0QWNjZXNzS2V5ZWQoYWNjZXNzKSB7XG4gICAgYWNjZXNzLm9iamVjdC5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZSgnWycpO1xuICAgIGFjY2Vzcy5rZXkuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJ10nKTtcbiAgfVxuXG4gIHZpc2l0Q2FsbFNjb3BlKGNhbGwpIHtcbiAgICB0aGlzLndyaXRlKGNhbGwubmFtZSk7XG4gICAgdGhpcy53cml0ZUFyZ3MoY2FsbC5hcmdzKTtcbiAgfVxuXG4gIHZpc2l0Q2FsbEZ1bmN0aW9uKGNhbGwpIHtcbiAgICBjYWxsLmZ1bmMuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGVBcmdzKGNhbGwuYXJncyk7XG4gIH1cblxuICB2aXNpdENhbGxNZW1iZXIoY2FsbCkge1xuICAgIGNhbGwub2JqZWN0LmFjY2VwdCh0aGlzKTtcbiAgICB0aGlzLndyaXRlKGAuJHtjYWxsLm5hbWV9YCk7XG4gICAgdGhpcy53cml0ZUFyZ3MoY2FsbC5hcmdzKTtcbiAgfVxuXG4gIHZpc2l0UHJlZml4KHByZWZpeCkge1xuICAgIHRoaXMud3JpdGUoYCgke3ByZWZpeC5vcGVyYXRpb259YCk7XG4gICAgcHJlZml4LmV4cHJlc3Npb24uYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5KGJpbmFyeSkge1xuICAgIHRoaXMud3JpdGUoJygnKTtcbiAgICBiaW5hcnkubGVmdC5hY2NlcHQodGhpcyk7XG4gICAgdGhpcy53cml0ZShiaW5hcnkub3BlcmF0aW9uKTtcbiAgICBiaW5hcnkucmlnaHQuYWNjZXB0KHRoaXMpO1xuICAgIHRoaXMud3JpdGUoJyknKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShsaXRlcmFsKSB7XG4gICAgdGhpcy53cml0ZShgJHtsaXRlcmFsLnZhbHVlfWApO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsQXJyYXkobGl0ZXJhbCkge1xuICAgIHZhciBlbGVtZW50cyA9IGxpdGVyYWwuZWxlbWVudHMsXG4gICAgICAgIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgaTtcblxuICAgIHRoaXMud3JpdGUoJ1snKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgdGhpcy53cml0ZSgnLCcpO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50c1tpXS5hY2NlcHQodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZSgnXScpO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsT2JqZWN0KGxpdGVyYWwpIHtcbiAgICB2YXIga2V5cyA9IGxpdGVyYWwua2V5cyxcbiAgICAgICAgdmFsdWVzID0gbGl0ZXJhbC52YWx1ZXMsXG4gICAgICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgdGhpcy53cml0ZSgneycpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSAhPT0gMCl7XG4gICAgICAgIHRoaXMud3JpdGUoJywnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy53cml0ZShgJyR7a2V5c1tpXX0nOmApO1xuICAgICAgdmFsdWVzW2ldLmFjY2VwdCh0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlKCd9Jyk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxTdHJpbmcobGl0ZXJhbCkge1xuICAgIHZhciBlc2NhcGVkID0gbGl0ZXJhbC52YWx1ZS5yZXBsYWNlKC8nL2csIFwiXFwnXCIpO1xuICAgIHRoaXMud3JpdGUoYCcke2VzY2FwZWR9J2ApO1xuICB9XG59XG5cbnZhciBldmFsTGlzdENhY2hlID0gW1tdLFswXSxbMCwwXSxbMCwwLDBdLFswLDAsMCwwXSxbMCwwLDAsMCwwXV07XG5cbi8vLyBFdmFsdWF0ZSB0aGUgW2xpc3RdIGluIGNvbnRleHQgb2YgdGhlIFtzY29wZV0uXG5mdW5jdGlvbiBldmFsTGlzdChzY29wZSwgbGlzdCwgdmFsdWVDb252ZXJ0ZXJzKSB7XG4gIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aCxcbiAgICAgIGNhY2hlTGVuZ3RoLCBpO1xuXG4gIGZvciAoY2FjaGVMZW5ndGggPSBldmFsTGlzdENhY2hlLmxlbmd0aDsgY2FjaGVMZW5ndGggPD0gbGVuZ3RoOyArK2NhY2hlTGVuZ3RoKSB7XG4gICAgZXZhbExpc3RDYWNoZS5wdXNoKFtdKTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBldmFsTGlzdENhY2hlW2xlbmd0aF07XG5cbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgcmVzdWx0W2ldID0gbGlzdFtpXS5ldmFsdWF0ZShzY29wZSwgdmFsdWVDb252ZXJ0ZXJzKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vLyBBZGQgdGhlIHR3byBhcmd1bWVudHMgd2l0aCBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLlxuZnVuY3Rpb24gYXV0b0NvbnZlcnRBZGQoYSwgYikge1xuICBpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCkge1xuICAgIC8vIFRPRE8oZGVib2VyKTogU3VwcG9ydCBvdGhlcnMuXG4gICAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBiICE9ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYSArIGIudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGEgIT0gJ3N0cmluZycgJiYgdHlwZW9mIGIgPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkgKyBiO1xuICAgIH1cblxuICAgIHJldHVybiBhICsgYjtcbiAgfVxuXG4gIGlmIChhICE9IG51bGwpIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGlmIChiICE9IG51bGwpIHtcbiAgICByZXR1cm4gYjtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVGdW5jdGlvbkZyb21NYXAob2JqLCBuYW1lKXtcbiAgdmFyIGZ1bmMgPSBvYmpbbmFtZV07XG5cbiAgaWYgKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cblxuICBpZiAoZnVuYyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5kZWZpbmVkIGZ1bmN0aW9uICR7bmFtZX1gKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gaXMgbm90IGEgZnVuY3Rpb25gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRLZXllZChvYmosIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9ialtwYXJzZUludChrZXkpXTtcbiAgfSBlbHNlIGlmIChvYmopIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0gZWxzZSBpZiAob2JqID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3NpbmcgbnVsbCBvYmplY3QnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0S2V5ZWQob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICB2YXIgaW5kZXggPSBwYXJzZUludChrZXkpO1xuXG4gICAgaWYgKG9iai5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgIG9iai5sZW5ndGggPSBpbmRleCArIDE7XG4gICAgfVxuXG4gICAgb2JqW2luZGV4XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG4iXX0= |